﻿package core.image
{
    import __AS3__.vec.*;
    import core.enum.*;
    import core.resource.*;
    import flash.display.*;
    import flash.utils.*;

    public class Brush extends Object
    {
        public var ID:String;
        public var width:int;
        public var height:int;
        public var size:int;
        public var step:int;
        public var type:BrushType;
        public var parent:Brush;
        public var data:Vector.<int>;
        public var details:ShapeDetails;
        public var outlinedata:Vector.<OutlinePoint>;
        private var thumbs:Dictionary;

        public function Brush(param1:BrushType, param2:Vector.<int>, param3:int, param4:int, param5:int, param6:ShapeDetails)
        {
            this.thumbs = new Dictionary();
            this.type = param1;
            this.data = param2;
            this.step = param5;
            this.width = param3;
            this.height = param4;
            this.details = param6;
            this.size = param3 > param4 ? (param3) : (param4);
            this.ID = GUID.Create();
            return;
        }// end function

        public function get outline() : Vector.<OutlinePoint>
        {
            if (this.outlinedata == null)
            {
                this.GenerateOutline();
            }
            return this.outlinedata;
        }// end function

        public function GenerateThumb(Create:int) : BitmapData
        {
            var _loc_2:BitmapData = null;
            var _loc_3:int = 0;
            var _loc_4:int = 0;
            var _loc_5:int = 0;
            var _loc_6:int = 0;
            var _loc_7:int = 0;
            var _loc_8:int = 0;
            var _loc_9:BitmapData = null;
            var _loc_10:Number = NaN;
            var _loc_11:Reform = null;
            var _loc_12:Brush = null;
            if (this.thumbs[Create] != null)
            {
                _loc_2 = this.thumbs[Create];
            }
            else
            {
                if (this.width <= Create && this.height <= Create)
                {
                    _loc_2 = new BitmapData(Create, Create, true, 16777215);
                    _loc_3 = Math.round((Create - this.width) * 0.5);
                    _loc_4 = Math.round((Create - this.height) * 0.5);
                    _loc_6 = -1;
                    _loc_7 = 0;
                    while (_loc_7 < this.height)
                    {
                        
                        _loc_8 = 0;
                        while (_loc_8 < this.width)
                        {
                            
                            _loc_6++;
                            _loc_5 = this.data[_loc_6];
                            if (_loc_5 > 0)
                            {
                                _loc_2.setPixel32(_loc_3 + _loc_8, _loc_4 + _loc_7, _loc_5 << 24 | 0 << 16 | 0 << 8 | 0);
                            }
                            _loc_8++;
                        }
                        _loc_7++;
                    }
                }
                else if (this.type == BrushType.Custom)
                {
                    _loc_9 = new BitmapData(this.width, this.height, true, 16777215);
                    _loc_6 = -1;
                    _loc_7 = 0;
                    while (_loc_7 < this.height)
                    {
                        
                        _loc_8 = 0;
                        while (_loc_8 < this.width)
                        {
                            
                            _loc_6++;
                            _loc_5 = this.data[_loc_6];
                            if (_loc_5 > 0)
                            {
                                _loc_9.setPixel32(_loc_8, _loc_7, _loc_5 << 24 | 0 << 16 | 0 << 8 | 0);
                            }
                            _loc_8++;
                        }
                        _loc_7++;
                    }
                    _loc_10 = this.width > this.height ? (Create / this.width) : (Create / this.height);
                    _loc_11 = new Reform();
                    _loc_2 = _loc_11.Resize(_loc_9, _loc_10, _loc_10);
                }
                else
                {
                    _loc_2 = new BitmapData(Create, Create, true, 16777215);
                    _loc_12 = Misc.GenerateBrush(new ShapeDetails(this.details.type, Create / 2 * 0.9, this.details.spikes, this.details.hardness, this.details.aspect, this.details.angle, this.details.step));
                    _loc_3 = Math.round((Create - _loc_12.width) / 2);
                    _loc_4 = Math.round((Create - _loc_12.height) / 2);
                    _loc_6 = -1;
                    _loc_7 = 0;
                    while (_loc_7 < _loc_12.height)
                    {
                        
                        _loc_8 = 0;
                        while (_loc_8 < _loc_12.width)
                        {
                            
                            _loc_6++;
                            _loc_5 = _loc_12.data[_loc_6];
                            if (_loc_5 > 0)
                            {
                                _loc_2.setPixel32(_loc_3 + _loc_8, _loc_4 + _loc_7, _loc_5 << 24 | 0 << 16 | 0 << 8 | 0);
                            }
                            _loc_8++;
                        }
                        _loc_7++;
                    }
                }
                this.thumbs[Create] = _loc_2;
            }
            return _loc_2;
        }// end function

        private function GenerateOutline() : void
        {
            var _loc_1:Boolean = false;
            var _loc_2:Boolean = false;
            var _loc_3:Boolean = false;
            var _loc_4:Boolean = false;
            var _loc_5:Boolean = false;
            var _loc_6:int = 0;
            var _loc_7:int = 0;
            this.outlinedata = new Vector.<OutlinePoint>;
            while (_loc_7 < this.height)
            {
                
                _loc_2 = true;
                _loc_3 = Boolean(this.data[_loc_7 * this.width] < 64);
                _loc_6 = 0;
                while (_loc_6 < this.width)
                {
                    
                    _loc_1 = _loc_2;
                    _loc_2 = _loc_3;
                    _loc_3 = (_loc_6 + 1) == this.width ? (true) : (this.data[_loc_7 * this.width + _loc_6 + 1] < 64);
                    if (!_loc_2)
                    {
                        _loc_4 = (_loc_7 - 1) < 0 ? (true) : (this.data[(_loc_7 - 1) * this.width + _loc_6] < 64);
                        _loc_5 = (_loc_7 + 1) == this.height ? (true) : (this.data[(_loc_7 + 1) * this.width + _loc_6] < 64);
                        if (_loc_1 && _loc_4 && _loc_3 && _loc_5)
                        {
                            this.outlinedata.push(new OutlinePoint(_loc_6, _loc_7, 8));
                        }
                        else if (_loc_1 && _loc_4 && _loc_5)
                        {
                            this.outlinedata.push(new OutlinePoint(_loc_6, _loc_7, 9));
                        }
                        else if (_loc_3 && _loc_4 && _loc_5)
                        {
                            this.outlinedata.push(new OutlinePoint(_loc_6, _loc_7, 10));
                        }
                        else if (_loc_3 && _loc_4 && _loc_1)
                        {
                            this.outlinedata.push(new OutlinePoint(_loc_6, _loc_7, 11));
                        }
                        else if (_loc_3 && _loc_5 && _loc_1)
                        {
                            this.outlinedata.push(new OutlinePoint(_loc_6, _loc_7, 12));
                        }
                        else if (_loc_1 && _loc_3)
                        {
                            this.outlinedata.push(new OutlinePoint(_loc_6, _loc_7, 13));
                        }
                        else if (_loc_5 && _loc_4)
                        {
                            this.outlinedata.push(new OutlinePoint(_loc_6, _loc_7, 14));
                        }
                        else if (_loc_1 && _loc_4)
                        {
                            this.outlinedata.push(new OutlinePoint(_loc_6, _loc_7, 0));
                        }
                        else if (_loc_4 && _loc_3)
                        {
                            this.outlinedata.push(new OutlinePoint(_loc_6, _loc_7, 2));
                        }
                        else if (_loc_1 && _loc_5)
                        {
                            this.outlinedata.push(new OutlinePoint(_loc_6, _loc_7, 5));
                        }
                        else if (_loc_5 && _loc_3)
                        {
                            this.outlinedata.push(new OutlinePoint(_loc_6, _loc_7, 7));
                        }
                        else if (_loc_4)
                        {
                            this.outlinedata.push(new OutlinePoint(_loc_6, _loc_7, 1));
                        }
                        else if (_loc_1)
                        {
                            this.outlinedata.push(new OutlinePoint(_loc_6, _loc_7, 3));
                        }
                        else if (_loc_3)
                        {
                            this.outlinedata.push(new OutlinePoint(_loc_6, _loc_7, 4));
                        }
                        else if (_loc_5)
                        {
                            this.outlinedata.push(new OutlinePoint(_loc_6, _loc_7, 6));
                        }
                    }
                    _loc_6++;
                }
                _loc_7++;
            }
            return;
        }// end function

    }
}
